home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 22 / PCPP #22.iso / Quake2 / q2source_12_11 / utils3 / qe4 / qe3.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-12  |  9.1 KB  |  431 lines

  1.  
  2. #include "qe3.h"
  3.  
  4. QEGlobals_t  g_qeglobals;
  5.  
  6. void QE_CheckOpenGLForErrors(void)
  7. {
  8.     int        i;
  9.     
  10.     while ( ( i = glGetError() ) != GL_NO_ERROR )
  11.     {
  12.         char buffer[100];
  13.  
  14.         sprintf( buffer, "OpenGL Error: %s", gluErrorString( i ) );
  15.  
  16.         MessageBox( g_qeglobals.d_hwndMain, buffer , "QuakeEd Error", MB_OK | MB_ICONEXCLAMATION );
  17.         exit( 1 );
  18.     }
  19. }
  20.  
  21.  
  22. char *ExpandReletivePath (char *p)
  23. {
  24.     static char    temp[1024];
  25.     char    *base;
  26.  
  27.     if (!p || !p[0])
  28.         return NULL;
  29.     if (p[0] == '/' || p[0] == '\\')
  30.         return p;
  31.  
  32.     base = ValueForKey(g_qeglobals.d_project_entity, "basepath");
  33.     sprintf (temp, "%s/%s", base, p);
  34.     return temp;
  35. }
  36.  
  37.  
  38.  
  39. void *qmalloc (int size)
  40. {
  41.     void *b;
  42.     b = malloc(size);
  43.     memset (b, 0, size);
  44.     return b;
  45. }
  46.  
  47. char *copystring (char *s)
  48. {
  49.     char    *b;
  50.     b = malloc(strlen(s)+1);
  51.     strcpy (b,s);
  52.     return b;
  53. }
  54.  
  55. /*
  56. ===============
  57. QE_CheckAutoSave
  58.  
  59. If five minutes have passed since making a change
  60. and the map hasn't been saved, save it out.
  61. ===============
  62. */
  63. void QE_CheckAutoSave( void )
  64. {
  65.     static clock_t s_start;
  66.     clock_t        now;
  67.  
  68.     now = clock();
  69.  
  70.     if ( modified != 1 || !s_start)
  71.     {
  72.         s_start = now;
  73.         return;
  74.     }
  75.  
  76.     if ( now - s_start > ( CLOCKS_PER_SEC * 60 * QE_AUTOSAVE_INTERVAL ) )
  77.     {
  78.         Sys_Printf ("Autosaving...\n");
  79.         Sys_Status ("Autosaving...", 0 );
  80.  
  81.         Map_SaveFile (ValueForKey(g_qeglobals.d_project_entity, "autosave"), false);
  82.  
  83.         Sys_Status ("Autosaving...Saved.", 0 );
  84.         modified = 2;
  85.         s_start = now;
  86.     }
  87. }
  88.  
  89.  
  90.  
  91. /*
  92. ===========
  93. QE_LoadProject
  94. ===========
  95. */
  96. qboolean QE_LoadProject (char *projectfile)
  97. {
  98.     char    *data;
  99.  
  100.     Sys_Printf ("QE_LoadProject (%s)\n", projectfile);
  101.  
  102.     if ( LoadFileNoCrash (projectfile, (void *)&data) == -1)
  103.         return false;
  104.     StartTokenParsing (data);
  105.     g_qeglobals.d_project_entity = Entity_Parse (true);
  106.     if (!g_qeglobals.d_project_entity)
  107.         Error ("Couldn't parse %s", projectfile);
  108.     free (data);
  109.  
  110.     Eclass_InitForSourceDirectory (ValueForKey (g_qeglobals.d_project_entity, "entitypath"));
  111.  
  112.     FillClassList ();        // list in entity window
  113.  
  114.     Map_New ();
  115.  
  116.     FillTextureMenu ();
  117.     FillBSPMenu ();
  118.  
  119.     return true;
  120. }
  121.  
  122. /*
  123. ===========
  124. QE_KeyDown
  125. ===========
  126. */
  127. #define    SPEED_MOVE    32
  128. #define    SPEED_TURN    22.5
  129.  
  130. qboolean QE_KeyDown (int key)
  131. {
  132.     switch (key)
  133.     {
  134.     case 'K':
  135.         PostMessage( g_qeglobals.d_hwndMain, WM_COMMAND, ID_MISC_SELECTENTITYCOLOR, 0 );
  136.         break;
  137.         
  138.     case VK_UP:
  139.         VectorMA (camera.origin, SPEED_MOVE, camera.forward, camera.origin);
  140.         Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
  141.         break;
  142.     case VK_DOWN:
  143.         VectorMA (camera.origin, -SPEED_MOVE, camera.forward, camera.origin);
  144.         Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
  145.         break;
  146.     case VK_LEFT:
  147.         camera.angles[1] += SPEED_TURN;
  148.         Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
  149.         break;
  150.     case VK_RIGHT:
  151.         camera.angles[1] -= SPEED_TURN;
  152.         Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
  153.         break;
  154.     case 'D':
  155.         camera.origin[2] += SPEED_MOVE;
  156.         Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY|W_Z_OVERLAY);
  157.         break;
  158.     case 'C':
  159.         camera.origin[2] -= SPEED_MOVE;
  160.         Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY|W_Z_OVERLAY);
  161.         break;
  162.     case 'A':
  163.         camera.angles[0] += SPEED_TURN;
  164.         if (camera.angles[0] > 85)
  165.             camera.angles[0] = 85;
  166.         Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
  167.         break;
  168.     case 'Z':
  169.         camera.angles[0] -= SPEED_TURN;
  170.         if (camera.angles[0] < -85)
  171.             camera.angles[0] = -85;
  172.         Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
  173.         break;
  174.     case VK_COMMA:
  175.         VectorMA (camera.origin, -SPEED_MOVE, camera.right, camera.origin);
  176.         Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
  177.         break;
  178.     case VK_PERIOD:
  179.         VectorMA (camera.origin, SPEED_MOVE, camera.right, camera.origin);
  180.         Sys_UpdateWindows (W_CAMERA|W_XY_OVERLAY);
  181.         break;
  182.         
  183.     case '0':
  184.         g_qeglobals.d_showgrid = !g_qeglobals.d_showgrid;
  185.         PostMessage( g_qeglobals.d_hwndXY, WM_PAINT, 0, 0 );
  186.         break;
  187.     case '1':
  188.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_GRID_1, 0);
  189.         break;
  190.     case '2':
  191.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_GRID_2, 0);
  192.         break;
  193.     case '3':
  194.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_GRID_4, 0);
  195.         break;
  196.     case '4':
  197.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_GRID_8, 0);
  198.         break;
  199.     case '5':
  200.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_GRID_16, 0);
  201.         break;
  202.     case '6':
  203.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_GRID_32, 0);
  204.         break;
  205.     case '7':
  206.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_GRID_64, 0);
  207.         break;
  208.         
  209.     case 'E':
  210.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_SELECTION_DRAGEDGES, 0);
  211.         break;
  212.     case 'V':
  213.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_SELECTION_DRAGVERTECIES, 0);
  214.         break;
  215.         
  216.     case 'N':
  217.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_VIEW_ENTITY, 0);
  218.         break;
  219.     case 'O':
  220.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_VIEW_CONSOLE, 0);
  221.         break;
  222.     case 'T':
  223.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_VIEW_TEXTURE, 0);
  224.         break;
  225.     case 'S':
  226.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_TEXTURES_INSPECTOR, 0);
  227.         break;
  228.         
  229.     case ' ':
  230.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_SELECTION_CLONE, 0);
  231.         break;
  232.         
  233.     case VK_BACK:
  234.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_SELECTION_DELETE, 0);
  235.         break;
  236.     case VK_ESCAPE:
  237.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_SELECTION_DESELECT, 0);
  238.         break;
  239.     case VK_END:
  240.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_VIEW_CENTER, 0);
  241.         break;
  242.         
  243.     case VK_DELETE:
  244.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_VIEW_ZOOMIN, 0);
  245.         break;
  246.     case VK_INSERT:
  247.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_VIEW_ZOOMOUT, 0);
  248.         break;
  249.         
  250.     case VK_NEXT:
  251.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_VIEW_DOWNFLOOR, 0);
  252.         break;
  253.     case VK_PRIOR:
  254.         PostMessage (g_qeglobals.d_hwndMain, WM_COMMAND, ID_VIEW_UPFLOOR, 0);
  255.         break;
  256.  
  257.     default:
  258.         return false;
  259.         
  260.     }
  261.  
  262.     return true;
  263. }
  264.  
  265. /*
  266. ===============
  267. ConnectEntities
  268.  
  269. Sets target / targetname on the two entities selected
  270. from the first selected to the secon
  271. ===============
  272. */
  273. void ConnectEntities (void)
  274. {
  275.     entity_t    *e1, *e2, *e;
  276.     char        *target, *tn;
  277.     int            maxtarg, targetnum;
  278.     char        newtarg[32];
  279.  
  280.     if (g_qeglobals.d_select_count != 2)
  281.     {
  282.         Sys_Status ("Must have two brushes selected.", 0);
  283.         Sys_Beep ();
  284.         return;
  285.     }
  286.  
  287.     e1 = g_qeglobals.d_select_order[0]->owner;
  288.     e2 = g_qeglobals.d_select_order[1]->owner;
  289.  
  290.     if (e1 == world_entity || e2 == world_entity)
  291.     {
  292.         Sys_Status ("Can't connect to the world.", 0);
  293.         Sys_Beep ();
  294.         return;
  295.     }
  296.  
  297.     if (e1 == e2)
  298.     {
  299.         Sys_Status ("Brushes are from same entity.", 0);
  300.         Sys_Beep ();
  301.         return;
  302.     }
  303.  
  304.     target = ValueForKey (e1, "target");
  305.     if (target && target[0])
  306.         strcpy (newtarg, target);
  307.     else
  308.     {
  309.         target = ValueForKey (e2, "targetname");
  310.         if (target && target[0])
  311.             strcpy (newtarg, target);
  312.         else
  313.         {
  314.             // make a unique target value
  315.             maxtarg = 0;
  316.             for (e=entities.next ; e != &entities ; e=e->next)
  317.             {
  318.                 tn = ValueForKey (e, "targetname");
  319.                 if (tn && tn[0])
  320.                 {
  321.                     targetnum = atoi(tn+1);
  322.                     if (targetnum > maxtarg)
  323.                         maxtarg = targetnum;
  324.                 }
  325.             }
  326.             sprintf (newtarg, "t%i", maxtarg+1);
  327.         }
  328.     }
  329.  
  330.     SetKeyValue (e1, "target", newtarg);
  331.     SetKeyValue (e2, "targetname", newtarg);
  332.     Sys_UpdateWindows (W_XY | W_CAMERA);
  333.  
  334.     Select_Deselect();
  335.     Select_Brush (g_qeglobals.d_select_order[1]);
  336. }
  337.  
  338. qboolean QE_SingleBrush (void)
  339. {
  340.     if ( (selected_brushes.next == &selected_brushes)
  341.         || (selected_brushes.next->next != &selected_brushes) )
  342.     {
  343.         Sys_Printf ("Error: you must have a single brush selected\n");
  344.         return false;
  345.     }
  346.     if (selected_brushes.next->owner->eclass->fixedsize)
  347.     {
  348.         Sys_Printf ("Error: you cannot manipulate fixed size entities\n");
  349.         return false;
  350.     }
  351.  
  352.     return true;
  353. }
  354.  
  355. void QE_Init (void)
  356. {
  357.     /*
  358.     ** initialize variables
  359.     */
  360.     g_qeglobals.d_gridsize = 8;
  361.     g_qeglobals.d_showgrid = true;
  362.  
  363.     /*
  364.     ** other stuff
  365.     */
  366.     Texture_Init ();
  367.     Cam_Init ();
  368.     XY_Init ();
  369.     Z_Init ();
  370. }
  371.  
  372. void QE_ConvertDOSToUnixName( char *dst, const char *src )
  373. {
  374.     while ( *src )
  375.     {
  376.         if ( *src == '\\' )
  377.             *dst = '/';
  378.         else
  379.             *dst = *src;
  380.         dst++; src++;
  381.     }
  382.     *dst = 0;
  383. }
  384.  
  385. int g_numbrushes, g_numentities;
  386.  
  387. void QE_CountBrushesAndUpdateStatusBar( void )
  388. {
  389.     static int      s_lastbrushcount, s_lastentitycount;
  390.     static qboolean s_didonce;
  391.     
  392.     entity_t   *e;
  393.     brush_t       *b, *next;
  394.  
  395.     g_numbrushes = 0;
  396.     g_numentities = 0;
  397.     
  398.     if ( active_brushes.next != NULL )
  399.     {
  400.         for ( b = active_brushes.next ; b != NULL && b != &active_brushes ; b=next)
  401.         {
  402.             next = b->next;
  403.             if (b->brush_faces )
  404.             {
  405.                 if ( !b->owner->eclass->fixedsize)
  406.                     g_numbrushes++;
  407.                 else
  408.                     g_numentities++;
  409.             }
  410.         }
  411.     }
  412.  
  413.     if ( entities.next != NULL )
  414.     {
  415.         for ( e = entities.next ; e != &entities && g_numentities != MAX_MAP_ENTITIES ; e = e->next)
  416.         {
  417.             g_numentities++;
  418.         }
  419.     }
  420.  
  421.     if ( ( ( g_numbrushes != s_lastbrushcount ) || ( g_numentities != s_lastentitycount ) ) || ( !s_didonce ) )
  422.     {
  423.         Sys_UpdateStatusBar();
  424.  
  425.         s_lastbrushcount = g_numbrushes;
  426.         s_lastentitycount = g_numentities;
  427.         s_didonce = true;
  428.     }
  429. }
  430.  
  431.